<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <link rel="stylesheet" href="php-txt-db-api.css" type="text/css">
  <title>SQL Syntax (Einschr&auml;nkungen f&uuml;r Txt-Db-Api)</title>
</head>
<body>
<div align="center">
<h1 align="left"> SQL Syntax der Txt-Db-Api (Einschr&auml;nkungen)</h1>
<h2 align="left">&nbsp;</h2>
<h2 align="left">Allgemein</h2>
<p align="left">Die Txt-Db-Api unterst&uuml;tzt nicht den ganzen
SQL-Sprachumfang, der unterst&uuml;tzte Umfang sollte jedoch<br>
mit dem SQL Standard kompatibel sein.<br>
Nachfolgend sind die Einschr&auml;nkungen bzw. die Syntax f&uuml;r SQL
Statements was die Txt-Db-Api betrifft aufgef&uuml;hrt. <br>
Werte in [] sind freiwillig, "..." bedeutet das beliebig viele weitere
Elemente folgen k&ouml;nnen,<br>
| heisst das entweder der eine ODER der andere wert genommen werden
kann.</p>
<p align="left"><b>Achtung: </b>Wie auch im Standard definiert,
sollten <b>Werte f&uuml;r str (String) Felder immer in die<br>
Anf&uuml;hrungszeichen ' ' oder " " eingeschlossen werden!</b></p>
<p align="left">&nbsp;</p>
<h2 align="left">SELECT</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">SELECT [DISTINCT]<br>[funktion(][tabelle.]spalte[)] [AS alias_name] [, [funktion(][tabelle].spalte[)] [AS alias_name] , ...]  <br>FROM tabelle [AS tabellen_alias] [, tabelle2 [AS tabellen_alias], ... ] <br>[[LEFT|RIGHT|INNER] [OUTER] JOIN [tabelle] ON tabelle2, ... ] <br>[WHERE spalte=wert AND|OR spalte=spalte AND|OR ...] <br>[GROUP BY spalte, ...]<br>[ORDER BY spalte [ASC | DESC] ,...] <br>[LIMIT [offset,]anzahl] [;]      <br>

</pre>
<h3 align="left">Unterst&uuml;tzt</h3>
<p>- Siehe Syntax</p>
<p>- Anstelle von Spaltennnamen (<font face="Courier New, Courier, mono">spalte</font>
in der Syntax oben) k&ouml;nnen auch direkte Werte verwendet werden.<br>
&nbsp;&nbsp;Das k&ouml;nnen entweder Zahlen oder Strings in ' ' oder
" " sein, z.B. <font face="Courier New, Courier, mono">SELECT 1234,
'bla', name FROM personen;</font></p>
- Folgende Funktionen: UNIX_TIMESTAMP(), MD5(spalte), NOW(),
ABS(spalte), LCASE(spalte), UCASE(spalte), LOWER(spalte),
UPPER(spalte), EVAL(spalte
*-+/ wert|spalte.....)<br>
- Die oben genannten Funktionen werden auch bei WHERE, GROUP BY und
ORDER BY unterst&uuml;tzt<br>
- Folgende gruppierenden Funktionen: MAX(spalte), MIN(spalte),
COUNT(spalte), SUM(spalte), AVG(spalte)<br>
- Anstelle einer spalte kann man f&uuml;r Funktionen auch direkte
Werte als Parameter angeben, z.B. md5('bla')<br>
<br>
- * anstelle von Feldnamen<br>
- tabelle.* anstelle von Feldnamen, auch Kombinationen m&ouml;glich
z.B. SELECT personen.*, firma.Name, ort.* ...<br>
- SELECT COUNT([table.]*)<br>
- Aliase f&uuml;r Tabellen </>
<p>- Im WHERE Teil werden folgende Vergleichsoperatoren
unterst&uuml;tzt: =,&gt;,&lt;,&gt;=,&lt;=, !=, &lt;&gt;, LIKE / NOT
LIKE (wildcards % und _), IN / NOT IN <br>
- Im WHERE Teil kann entweder feld=wert, wert=wert oder auch feld=feld
stehen<br>
&nbsp;&nbsp;(um tabellen verkn&uuml;pft abzufragen, wie z.B. im
Beispiel unten "personen.typ_id = typen.id")<br>
&nbsp;&nbsp;"=" steht hier nur als Beispiel, f&uuml;r Feld=Feld sind
alle oben genannten Vergleichsoperatoren m&ouml;glich<br>
- Im WHERE Teil k&ouml;nnen beliebige viele AND und OR verwendet werden
<br>
- Im WHERE Teil k&ouml;nnen beliebig viele Klammern verwendet und
verschachtelt werden <br>
<br>
- JOIN's (INNER, LEFT [OUTER] und RIGHT [OUTER])<br>
- DISTINCT: nur zeilen die sich eindeutig von andern unterscheiden
werden zur&uuml;ckgegeben<br>
- GROUP BY: ergebniss nach den angegebenen spalten gruppieren. <br>
</p>
<p>- LIMIT (nur bei SELECT): <i>offset</i> ist ein offset <b>beginnend
bei 0</b> (d.h. ein offset 1 startet bei der 2. Reihe), <br>
&nbsp;&nbsp;welches angibt ab welcher Reihe man das Ergebnis auf <i>anzahl
</i>Zeilen limitieren m&ouml;chte.<br>
&nbsp;&nbsp;Wenn man ein LIMIT angibt so ist <i>anzahl </i>obligatorisch,
das offset kann auch weggelassen werden.<br>
&nbsp;&nbsp;Beispiel: LIMIT 4,10 (Liefert nur die Zeilen von 5 bis
und mit 14 zur&uuml;ck =&gt; Anzahl = 10)</p>
<p>- Bei DISTINCT und GROUP BY wird immer der erste wert genommen,<br>
&nbsp;&nbsp;Beispiel: "SELECT time, ip FROM log GROUP BY time"</p>
<table style="width: 599px; height: 90px;" border="0">
  <tbody>
    <tr>
      <td width="160">time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;ip<br>
10348395 | 192.168.0.1<br>
10348395 | 192.168.0.3</td>
      <td width="34">
      <div align="center">&gt;</div>
      </td>
      <td width="255">time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;ip<br>
10348395 | 192.168.0.1</td>
    </tr>
  </tbody>
</table>
<p><br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p>- Zusammenf&uuml;gen von Feldern wie zB <i>SELECT name &amp; " "
&amp; vorname AS ganzer_name</i> oder <i><br>
&nbsp;&nbsp;SELECT name + vorname AS ganzer_name</i><br>
- Alles was nicht irgendwie unter Syntax oder Unterst&uuml;tzt zu
finden ist</p>
<h3>Beispiele</h3>
<p>SELECT vorname, personen.nachname, typen.typ AS personen_typ FROM
personen, typen <br>
WHERE personen.typ_id = typen.id AND (personen.Nr&gt;=10 OR
personen.vorname='Hans') <br>
ORDER BY vorname LIMIT 100</p>
<p>SELECT COUNT(t.name), AVG(t.alter) AS durchschnittsalter, k.name
FROM
teilnehmer AS t, kurs AS k<br>
WHERE t.kurs_nr=kurs.id GROUP BY k.name;</p>
<p>SELECT md5('bla');<br>
</p>
<h3>Hinweise</h3>
<p><b>ACHTUNG: </b>Vor und nach jedem OR oder AND m&uuml;ssen je ein
Leerschlag (" ") stehen. <br>
Dies damit der Parser genau zwischen AND und OR's die eventuell zu
Feldnamen geh&ouml;ren<br>
oder AND und OR's die als Teil der Logik gemeint sind, unterscheiden
kann !<br>
Das gleiche gilt f&uuml;r LIKE!</p>
<p> Ung&uuml;ltig: Name='Test'OR Nr&gt;20 <br>
G&uuml;ltig: Name='Test' OR Nr&gt;20</p>
<p><b>ACHTUNG: </b>Benutzt LIKE nur wenn es zwingend n&ouml;tig ist,
da LIKE viel langsamer ist als ein<br>
normaler String-Vergleich. Wenn man also alle Datens&auml;tze Abfragen
will wo der ort <b>genau</b> 'Basel'<br>
ist sollte man es so machen: SELECT * FROM tabelle WHERE ort='Basel'
<br>
und NICHT so: SELECT * FROM tabelle WHERE ort LIKE 'Basel'<br>
und schon GAR NICHT so: SELECT * FROM tabelle WHERE ort LIKE '%Basel%'</p>
<p>&nbsp;</p>
<h2 align="left">INSERT</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">INSERT [INTO] tabelle [(spalte1, spalte2, spalte_n, ...)] <br>VALUES  (  [funktion(]wert[)]  [, funktion[(]wert2[)], wert_n, ...]) [;]<br>	oder<br>INSERT [INTO] tabelle <br>SET spalte= [funktion(] wert [)]  [, spalte2=[funktion(]wert2[)], spalte_n=[funktion(]wert_n[)], ...] [;]<br></pre>
<h3 align="left">Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- Folgende Funktionen: UNIX_TIMESTAMP(), MD5(wert), NOW(), ABS(wert),
LCASE(wert), UCASE(wert), LOWER(wert), UPPER(wert) <br>
- Als Parameter f&uuml;r die Funktionen werden hier logischerwesie
nur Werte und keine Spalten unterst&uuml;tzt.<br>
<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
- INSERT mit SELECT<br>
- Mehrere Datens&auml;tze einf&uuml;gen (in einem SQL Statement)<br>
- Gruppierende Funktionen wie zB MAX(), MIN() etc. (was auch gar keinen
Sinn machen w&uuml;rde!)<br>
- Alles was nicht irgendwie unter Syntax zu finden ist
<h3 align="left">Beispiele</h3>
<p>INSERT INTO personen (vorname, nachname) VALUES ('hans','meier');</p>
<p>INSERT INTO passwords (user, password) VALUES ( 'user1',
md5('mypassword') );</p>
<p>INSERT INTO personen SET vorname=upper('hans'), alter=abs(-55),
eingetragen=NOW() ; </p>
<p>&nbsp;</p>
<h2 align="left">DELETE</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">DELETE FROM tabelle [WHERE &lt;gleich wie bei SELECT&gt;] [;]<br></pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- Das l&ouml;schen der ganzen Tabelle (kein WHERE angeben)<br>
- F&uuml;r den WHERE Teil gilt das gleiche wie bei SELECT (funktionen
werden also auch unterst&uuml;zt!)<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p>- LIMIT<br>
- Alles was nicht irgendwie unter Syntax zu finden ist</p>
<h3>Beispiele</h3>
<p>DELETE FROM personen WHERE vorname='Hans';</p>
<p>DELETE FROM personen WHERE passwort=md5('mypw') AND
abs(alter)=abs(-5);</p>
<p>&nbsp;</p>
<h2 align="left">UPDATE</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">UPDATE tabelle SET spalte=[funktion(]wert[)] [,spalte2=[funktion(]wert2[)], spalte_n=[funktion(]wert_n[)], ...] <br>[WHERE &lt;gleich wie bei SELECT&gt;] [;]<br></pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- Folgende Funktionen f&uuml;r die Werte: UNIX_TIMESTAMP(),
MD5(spalte oder wert), NOW(), ABS(spalte oder wert), <br>
&nbsp;&nbsp;LCASE(spalte oder wert), UCASE(spalte oder wert),
LOWER(spalte oder wert), UPPER(spalte oder wert), EVAL(spalte
*-+/ wert|spalte.....)<br>
- Updaten der ganzen Tabelle (kein WHERE angeben)<br>
- Zuweisen des Wertes einer Spalte an eine andere<br>
- F&uuml;r den WHERE Teil gilt das gleiche wie bei SELECT (funktionen
werden also auch unterst&uuml;zt!) <br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p>- LIMIT<br>
- ORDER BY<br>
- Alles was nicht irgendwie unter Syntax zu finden ist</p>
<h3>Beispiele</h3>
<p>UPDATE personen SET vorname='Hans2000' WHERE vorname='Hans';<br>
<br>
UPDATE personen SET vorname=nachname WHERE vorname='Hans'; <br>
<br>
UPDATE personen SET passwort=md5(passwort);<br>
<br>
UPDATE personen SET alter=abs(-20), name=upper(name); </p>
</div>
<p>&nbsp;</p>
</div>
<h2 align="left"><a name="createTable"></a>CREATE TABLE</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">CREATE TABLE tabellen_name (spalten_name  typ [DEFAULT 'defaultWert'] [, spalten_name2  typ2 [DEFAULT 'defaultWert'], ... ]) [;]<br></pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- DEFAULT (Den Defaultwert in ' ' setzten, auch bei Zahlen)<br>
- Wenn f&uuml;r eine inc Spalte ein Defaultwert gesetzt wurde,
so sind die inc Werte des ersten<br>
&nbsp;&nbsp;Datensatzes Defaultwert+1. F&uuml;r alle weiteren
Spalten wird der Defaultwert ignoriert.<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
- Nur folgende Syntax (spalten_name typ , spalten_name typ , ....)
<br>
&nbsp;&nbsp;und sonst kein einiziges Keyword (ausser DEFAULT)!!
<br>
- SQL Standardtypen, <b>typ kann nur inc (AutoWert), int (Zahl)
oder str (Text) sein.</b></p>
<h3>Beispiel</h3>
<p>CREATE TABLE personen (id inc, vorname str DEFAULT 'john' , nachname
str);</p>
<p>&nbsp;</p>
<h2 align="left">DROP TABLE</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">DROP TABLE tabelle1 [, tabelle2, ...][;]</pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- 1 oder mehrere Tabellen gleichzeitig l&ouml;schen<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
</p>
<h3>Beispiel</h3>
<p>DTOP TABLE personen;</p>
<p>&nbsp;</p>
</div>
<h2 align="left">LIST TABLES</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">LIST TABLES [WHERE ...] <br>[GROUP BY spalten_name, ...]<br>[ORDER BY spalten_name [ASC | DESC] ,...] <br>[LIMIT [offset,]anzahl] [;]      </pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- Gibt alle Tabellen einer Datenbank als ResultSet Objekt zur&uuml;ck.
Dieses ResultSet hat eine Spalte<br>
&nbsp;&nbsp;Namens "table" welche den Tabellennamen als String
enth&auml;lt<br>
- F&uuml;r WHERE, GROUP BY, ORDER BY und LIMIT Syntax siehe
SELECT<br>
<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
- Funktionen</p>
<h3>Beispiel</h3>
<p>LIST TABLES;</p>
</div>
<p>&nbsp;</p>
<h2 align="left">CREATE DATABASE</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">CREATE DATABASE datanbank_name [;]</pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- Nur eine Databank kann mit einem Statement erzeugt werden.<br>
- Dieses Statement sollte NUR auf einer ROOT_DATABASE Datanbank
ausgef&uuml;hrt werden.<br>
&nbsp;&nbsp;Man erh&auml;lt diese mit einem $db=new
Database(ROOT_DATABASE); aufruf. <br>
&nbsp;&nbsp;ROOT_DATABASE ist eine definierte Konstante.<br>
<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
</p>
<h3>Beispiel</h3>
<p>CREATE DATABASE meineDatenbank;</p>
</div>
<p>&nbsp;</p>
<h2 align="left">DROP DATABASE</h2>
<h3 align="left">Syntax</h3>
<div align="left">
<pre align="left">DROP DATABASE datanbank_name [;]</pre>
<h3 align="left"><br>
Unterst&uuml;tzt</h3>
<p>- Siehe Syntax<br>
- Nur eine Databank kann mit einem Statement gel&ouml;scht werden.<br>
- Dieses Statement sollte NUR auf einer ROOT_DATABASE Datanbank
ausgef&uuml;hrt werden.<br>
&nbsp;&nbsp;Man erh&auml;lt diese mit einem $db=new
Database(ROOT_DATABASE); aufruf. <br>
&nbsp;&nbsp;ROOT_DATABASE ist eine definierte Konstante.<br>
<br>
</p>
<h3 align="left">Nicht unterst&uuml;tzt</h3>
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
</p>
<h3>Beispiel</h3>
<p>DROP DATABASE meineDatenbank;</p>
</div>
<p>&nbsp;</p>
</div>
</div>
</div>
</div>
<br>
</body>
</html>
